package com.atguigu.gmall.realtime.utils;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.gmall.realtime.common.GmallConfig;
import com.google.common.base.CaseFormat;
import org.apache.commons.beanutils.BeanUtils;

import java.lang.reflect.InvocationTargetException;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @author jason
 * @create 2022-04-16 15:21
 */
public class JdbcUtil {
    /**
     * select * from t1;
     * xx,xx,xx
     * xx,xx,xx
     * 工具类的异常尽量往外抛
     *
     * @param connection        JDSC链接地址
     * @param querySql          查询SQL语句
     * @param <T>               返回的List里面对象 类型
     * @param underScoreToCamel 要不要把下划线命名转换为驼峰 JavaBean 本身就是下划线就不用
     * @return
     */
    public static <T> List<T> queryList(Connection connection
            , String querySql
            , Class<T> clz
            , Boolean underScoreToCamel) throws SQLException, InstantiationException, IllegalAccessException,
            InvocationTargetException {
        //创建集合用于存放结果数据
        ArrayList<T> resultList = new ArrayList<>();

        //预编译SQL
        PreparedStatement preparedStatement = connection.prepareStatement(querySql);

//        执行查询
        ResultSet resultSet = preparedStatement.executeQuery();

//        解析resultSet
//        拿到列信息 元数据信息
        ResultSetMetaData metaData = resultSet.getMetaData();
//        JDBC 下标都是从1 开始
        int columnCount = metaData.getColumnCount();

        while (resultSet.next()) {
//            创建 泛型对象
            T t = clz.newInstance();

//            给泛型对象赋值
            for (int i = 1; i < columnCount + 1; i++) {
//                获取列名
                String columnName = metaData.getColumnName(i);

//                判断是否需要转换为驼峰命名
                if (underScoreToCamel) {
                    columnName = CaseFormat.LOWER_UNDERSCORE
                            .to(CaseFormat.LOWER_CAMEL
//                                    phoenix 大写 mysql小写 统一做转换
                                    , columnName.toLowerCase());
                }
//                获取列值
                Object value = resultSet.getObject(i);

//                给泛型对象赋值  对象 列明 列值
//                BeanUtils.copyProperties(t,columnName,value); JSONObject => {}
                BeanUtils.setProperty(t, columnName, value);
            }
//            将该对象添加至集合
            resultList.add(t);
        }
        preparedStatement.close();
        ;
        resultSet.close();
        //返回结果集合
        return resultList;
    }

    public static void main(String[] args) throws ClassNotFoundException, SQLException, InvocationTargetException,
            InstantiationException, IllegalAccessException {
//        System.out.println(CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "aa_bb"));

//Class.forName(GmallConfig.PHOENIX_DRIVER);
//        Connection connection = DriverManager.getConnection(GmallConfig.PHOENIX_SERVER);

//        List<JSONObject> queryList = queryList(connection,
//                "select * from GMALL_REALTIME.DIM_USER_INFO",
//                JSONObject.class,
//                true);
//        for (JSONObject jsonObject : queryList) {
//            System.out.println(jsonObject);
//        }
//        connection.close();

        // 加载数据库驱动
        Class.forName("com.mysql.jdbc.Driver");
        // 声明数据库db_database17的URL
        String url = "jdbc:mysql://hadoop101:3306/gmall-realtime";
        // 数据库用户名
        String user = "root";
        // 数据库密码
        String password = "000000";

        // 建立数据库连接，获得连接对象conn
        Connection connection = DriverManager.getConnection(url, user, password);

        // 生成一条sql语句
        String sql = "select * from table_process";

        List<JSONObject> queryList = queryList(connection,
                sql,
                JSONObject.class,
                true);
        for (JSONObject jsonObject : queryList) {
            System.out.println(jsonObject);
        }
        connection.close();


    }
}
